package com.chub.study.exception;

import com.chub.RespEnum;
import com.chub.RespResult;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.client.HttpClientErrorException;

/**
 * @author : chub
 * @version : V1.0.0
 * @fileName : GlobalExceptionHandler.java
 * @description : 统一异常处理器
 * GlobalExceptionHandler 不起作用可能是由于以下几个原因：
 *      注解问题：确保你使用的是正确的注解，例如在Spring中应使用@ControllerAdvice而不是其他类似的注解。
 *      扫描路径问题：确保包含GlobalExceptionHandler的类被Spring容器正确扫描并注册。如果是使用注解配置，确保@ComponentScan包含了该类所在的包。
 *      方法限制：GlobalExceptionHandler中的方法应该是公开的，并且应该可以被容器调用。确保方法的访问修饰符是public。
 *      方法签名问题：@ExceptionHandler标注的方法应该正确地捕获了预期的异常类型。
 *      Spring版本问题：如果你使用的是较旧或较新的Spring版本，可能存在兼容性问题。确保你的Spring版本与GlobalExceptionHandler的使用方式相兼容。
 *      配置问题：如果你使用的是复杂的配置，可能存在某些配置导致GlobalExceptionHandler未被正确加载。检查你的配置文件，确保没有错误配置。
 * @createTime : 2022-04-23 10:32
 */


@ControllerAdvice
@Slf4j
public class GlobalExceptionHandler {

    /**
     * -------- 通用异常处理方法 --------
     **/
    @ExceptionHandler(Exception.class)
    @ResponseBody
    public RespResult error(Exception e) {
        e.printStackTrace();
        log.error("error:{}, message:{}", e.getClass().getName(), e.getMessage());
        return RespResult.error(RespEnum.UNKNOWN_ERROR); // 通用异常结果
    }

    /**
     * -------- 指定异常处理方法 --------
     **/
    @ExceptionHandler(NullPointerException.class)
    @ResponseBody
    public RespResult error(NullPointerException e) {
        e.printStackTrace();
        return RespResult.error(RespEnum.NULL_POINT);
    }

    @ExceptionHandler(HttpClientErrorException.class)
    @ResponseBody
    public RespResult error(IndexOutOfBoundsException e) {
        e.printStackTrace();
        return RespResult.error(RespEnum.HTTP_CLIENT_ERROR);
    }

    /**
     * -------- 自定义定异常处理方法 --------
     **/
    @ExceptionHandler(StudyException.class)
    @ResponseBody
    public RespResult error(StudyException e) {
        // e.printStackTrace();
        // log.error("className:{}, message:{}", e.getClass().getName(), e.getMessage());
        log.error("exception message :", e);
        return RespResult.error(e.getRespEnum().getCode(), e.getMessage());
    }


    // @ExceptionHandler(value = StudyException.class)
    // public ResponseEntity<R<String>> handleStudyException(StudyException e) {
    //     R<String> response = R.error().code(e.getRespEnum().getCode());
    //     return new ResponseEntity<>(response, HttpStatus.valueOf(e.getRespEnum().getCode()));
    // }

    // @ExceptionHandler(value = Exception.class)
    // public ResponseEntity<R<String>> handleException(Exception e) {
    //     // 这里可以记录日志等操作
    //     R<String> response = R.error(REnum.FAIL);
    //     return new ResponseEntity<>(response, HttpStatus.INTERNAL_SERVER_ERROR);
    // }


    }
